const path = require('path')
const config = require('./config')
const {getPageEntry} = require('./build/utils.js')
const {PAGE_NAME} = process.env
const CopyWebpackPlugin = require('copy-webpack-plugin')
const port = process.env.port || process.env.npm_config_port || config.dev.port || 8080 // dev port
const isDev = process.env.NODE_ENV === 'development'

const defaultPage = (PAGE_NAME || '').split(',')[0] // 调整默认启动页面，如果有 portal，就默认Wie portal

function resolve(dir) {
    return path.join(__dirname, dir)
}

module.exports = {
    transpileDependencies: isDev ? [] : [/node_modules/], //es6转es5
    // 部署应用包时的基本 URL,用法和 webpack 本身的 output.publicPath 一致
    publicPath: isDev ? '/' : './',

    // 指定生成的 index.html 的输出路径 (相对于 outputDir)。也可以是一个绝对路径。
    outputDir: resolve(`./dist/${PAGE_NAME}`),
    // Paths
    //放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。
    assetsDir: 'assets',
    // eslint-loader 是否在保存的时候检查
    lintOnSave: false,
    // 是否使用包含运行时编译器的 Vue 构建版本
    runtimeCompiler: true,
    // 生产环境是否生成 sourceMap 文件
    productionSourceMap: false,
    // devtool: "source-map", //cheap-module-eval-source-map  source-map
    // 生成的 HTML 中的 <link rel="stylesheet"> 和 <script> 标签上启用 Subresource Integrity (SRI)
    integrity: false,
    //在 multi- page 模式下构建应用。每个“page”应该有一个对应的 JavaScript 入口文件。其值应该是一个对象，对象的 key 是入口的名字，value 是：
    // 一个指定了 entry, template, filename, title 和 chunks 的对象(除了 entry 之外都是可选的)；
    // 或一个指定其 entry 的字符串。
    pages: getPageEntry(PAGE_NAME),
    // webpack-dev-server 相关配置 所有 webpack-dev-server 的选项都支持 https://webpack.js.org/configuration/dev-server/
    devServer: {
        port: port, //指定监听请求的端口号
        open: true, //告诉dev-server在服务器启动后打开浏览,将其设置为true以打开默认设置浏览器。
        index: `${defaultPage}.html`,
        overlay: {
            warnings: false,
            errors: true,
        },
        // http 代理配置
        proxy: {
            ...config.dev.proxyTable,
        },
        // before: require("./mock/mock-server.js")
    },
    // webpack相关配置
    chainWebpack: (config) => {
        // set svg-sprite-loader
        config.module.rule('svg').exclude.add(resolve('src/modules/admin/icons')).end()
        config.module
            .rule('icons')
            .test(/\.svg$/)
            .include.add(resolve('src/modules/admin/icons'))
            .end()
            .use('svg-sprite-loader')
            .loader('svg-sprite-loader')
            .options({
                symbolId: 'icon-[name]',
            })
            .end()
        // set preserveWhitespace
        // config.module
        //     .rule('vue')
        //     .set('exclude', getExcludePaths(PAGE_NAME))
        //     // .exclude.add(resolve(`src/modules/admin`))
        //     // .end()
        //     .use('vue-loader')
        //     .loader('vue-loader')
        //     .tap(options => {
        //         options.compilerOptions.preserveWhitespace = true;
        //         return options;
        //     })
        //     .end();
        // config.module
        //     .rule('md')
        //     .test(/\.md$/)
        //     .use('html-loader')
        //     .loader('html-loader')
        //     .end()
        //     .use('markdown-loader')
        //     .loader('markdown-loader')
        //     .options({
        //         gfm: true
        //     })
        //     .end();

        // config.module
        //     .rule('html')
        //     .test(/\.html$/)
        //     .exclude.add(resolve(`public`))
        //     .end()
        //     .use('html-loader')
        //     .loader('html-loader')
        //     .end();

        config
            // https://webpack.js.org/configuration/devtool/#development
            .when(isDev, (config) => config.devtool('cheap-source-map'))
        config.when(!isDev, (config) => {
            config
                .plugin('ScriptExtHtmlWebpackPlugin')
                .after('html')
                .use('script-ext-html-webpack-plugin', [
                    {
                        // `runtime` must same as runtimeChunk name. default is `runtime`
                        inline: /runtime\..*\.js$/,
                    },
                ])
                .end()
            config.optimization.splitChunks({
                chunks: 'all',
                cacheGroups: {
                    libs: {
                        name: 'chunk-libs',
                        test: /[\\/]node_modules[\\/]/,
                        priority: 10,
                        chunks: 'initial', //仅限于最初依赖的第三方
                    },
                    elementUI: {
                        name: 'chunk-elementUI', //将elementUI拆分为单个包
                        priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                        test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
                    },
                    // commons: {
                    //   name: 'chunk-commons',
                    //   test: resolve('src/plugins'), // can customize your rules
                    //   // minChunks: 3, //  minimum common number
                    //   enforce: true,
                    //   priority: 5,
                    //   reuseExistingChunk: true
                    // }
                },
            })
            config.optimization.runtimeChunk('single')
        })
        // config.when(isDev, // 开发环境
        //     // config => config.devtool('cheap-source-map') // 转换过的源码-快
        //     config => {
        //         if (isDev) {
        //             console.log("开启source-map........")
        //             config.devtool('source-map') // 源码-慢
        //         }
        //     }
        // )

        Object.keys(getPageEntry(PAGE_NAME)).forEach((page) => {
            config.plugins.delete(`preload-${page}`)
            config.plugins.delete(`prefetch-${page}`)
        })
    },
    configureWebpack: (config) => {
        return {
            name: 'yhdz',
            resolve: {
                alias: {
                    '@': resolve('src'),
                    modules: resolve('src/modules'),
                    [defaultPage]: resolve(`src/modules/${defaultPage}`), //projectA: resolve('src/modules/projectA')
                    sc: resolve('src/modules/admin/smartCampus'),
                },
            },
            plugins: [
                new CopyWebpackPlugin([
                    {
                        //使用static文件夹
                        from: './static',
                        to: 'static',
                    },
                ]),
            ],
        }
    },
    // css相关配置
    css: {
        // // 是否分离css（插件ExtractTextPlugin） Default: 生产环境下是 true，开发环境下是 false
        // extract: true,
        // // 是否开启 CSS source maps 设置为 true 之后可能会影响构建的性能
        // sourceMap: false,
        // css预设器配置项
        loaderOptions: {
            sass: {
                data: `
              @import "${defaultPage}/styles/variables.scss";
              `,
            },
        },
        // 是否启用 CSS modules for all css / pre-processor files.
        // requireModuleExtension: true,
    },
    // 是否使用 thread-loader
    parallel: require('os').cpus().length > 1,
    // PWA 插件相关配置
    pwa: {},
    // 第三方插件配置
    pluginOptions: {},
}
